{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualizing GoogLeNet filters\n",
    "\n",
    "This is an ipython notebook to generate visualizations of GoogLeNet filters, for some more info refer to [this blogpost](https://auduno.github.io/2016/06/18/peeking-inside-convnets/).\n",
    "\n",
    "To run this code, you'll need an installation of Caffe with built pycaffe libraries, as well as the python libraries numpy, scipy and PIL. For instructions on how to install Caffe and pycaffe, refer to the installation guide [here](http://caffe.berkeleyvision.org/installation.html). Before running the ipython notebooks, you'll also need to download the [GoogLeNet model](https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet), and modify the variables ```pycaffe_root``` to refer to the path of your pycaffe installation (if it's not already in your python path) and ```model_path``` to refer to the path of the downloaded GoogLeNet caffe model. Also uncomment the line that enables GPU mode if you have built Caffe with GPU-support and a suitable GPU available.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# imports and basic notebook setup\n",
    "from cStringIO import StringIO\n",
    "import numpy as np\n",
    "import os,re,random\n",
    "import scipy.ndimage as nd\n",
    "import PIL.Image\n",
    "import sys\n",
    "from IPython.display import clear_output, Image, display\n",
    "from scipy.misc import imresize\n",
    "\n",
    "pycaffe_root = \"/your/path/here/caffe/python\" # substitute your path here\n",
    "sys.path.insert(0, pycaffe_root)\n",
    "import caffe\n",
    "\n",
    "model_name=\"GoogLeNet\"\n",
    "model_path = '/your/path/here/caffe_models/bvlc_googlenet/' # substitute your path here\n",
    "# modified deploy.prototxt, switched relus to leaky relus\n",
    "net_fn   = './googlenet_deploy_mod.prototxt'\n",
    "param_fn = model_path + 'bvlc_googlenet.caffemodel'\n",
    "means = np.float32([104.0, 117.0, 123.0])\n",
    "\n",
    "#caffe.set_mode_gpu() # uncomment this if gpu processing is available\n",
    "\n",
    "net = caffe.Classifier(net_fn, param_fn,\n",
    "                       mean = means, # ImageNet mean, training set dependent\n",
    "                       channel_swap = (2,1,0)) # the model has channels in BGR order instead of RGB\n",
    "\n",
    "# a couple of utility functions for converting to and from Caffe's input image layout\n",
    "def preprocess(net, img):\n",
    "    return np.float32(np.rollaxis(img, 2)[::-1]) - net.transformer.mean['data']\n",
    "def deprocess(net, img):\n",
    "    return np.dstack((img + net.transformer.mean['data'])[::-1])\n",
    "\n",
    "def blur(img, sigma):\n",
    "    if sigma > 0:\n",
    "        img[0] = nd.filters.gaussian_filter(img[0], sigma, order=0)\n",
    "        img[1] = nd.filters.gaussian_filter(img[1], sigma, order=0)\n",
    "        img[2] = nd.filters.gaussian_filter(img[2], sigma, order=0)\n",
    "    return img\n",
    "\n",
    "def showarray(a, f, fmt='jpeg'):\n",
    "    a = np.uint8(np.clip(a, 0, 255))\n",
    "    f = StringIO()\n",
    "    PIL.Image.fromarray(a).save(f, fmt)\n",
    "    display(Image(data=f.getvalue()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def make_step(net, step_size=1.5, end='inception_4c/output', clip=True, focus=None, sigma=None):\n",
    "    '''Basic gradient ascent step.'''\n",
    "\n",
    "    src = net.blobs['data'] # input image is stored in Net's 'data' blob\n",
    "\n",
    "    dst = net.blobs[end]\n",
    "    net.forward(end=end)\n",
    "    \n",
    "    one_hot = np.zeros_like(dst.data)\n",
    "    filter_shape = dst.data.shape\n",
    "    if len(filter_shape) > 2:\n",
    "        # backprop only activation in middle of filter\n",
    "        one_hot[0,focus,(filter_shape[2]-1)/2,(filter_shape[3]-1)/2] = 1.\n",
    "    else:\n",
    "        one_hot.flat[focus] = 1.\n",
    "    dst.diff[:] = one_hot\n",
    "    \n",
    "    net.backward(start=end)\n",
    "    g = src.diff[0]\n",
    "    \n",
    "    src.data[:] += step_size/np.abs(g).mean() * g\n",
    "\n",
    "    if clip:\n",
    "        bias = net.transformer.mean['data']\n",
    "        src.data[:] = np.clip(src.data, -bias, 255-bias) \n",
    "        \n",
    "    src.data[0] = blur(src.data[0], sigma)\n",
    "    \n",
    "    dst.diff.fill(0.)\n",
    "\n",
    "def deepdraw(net, base_img, octaves, random_crop=True, visualize=True, focus=None,\n",
    "    clip=True, **step_params):\n",
    "    \n",
    "    # prepare base image\n",
    "    image = preprocess(net, base_img) # (3,224,224)\n",
    "    \n",
    "    # get input dimensions from net\n",
    "    w = net.blobs['data'].width\n",
    "    h = net.blobs['data'].height\n",
    "    \n",
    "    print \"starting drawing\"\n",
    "    src = net.blobs['data']\n",
    "    src.reshape(1,3,h,w) # resize the network's input image size\n",
    "    for e,o in enumerate(octaves):\n",
    "        if 'scale' in o:\n",
    "            # resize by o['scale'] if it exists\n",
    "            image = nd.zoom(image, (1,o['scale'],o['scale']))\n",
    "        _,imw,imh = image.shape\n",
    "        \n",
    "        # select layer\n",
    "        layer = o['layer']\n",
    "        \n",
    "        for i in xrange(o['iter_n']):\n",
    "            if imw > w:\n",
    "                if random_crop:\n",
    "                    # randomly select a crop \n",
    "                    #ox = random.randint(0,imw-224)\n",
    "                    #oy = random.randint(0,imh-224)\n",
    "                    mid_x = (imw-w)/2.\n",
    "                    width_x = imw-w\n",
    "                    ox = np.random.normal(mid_x, width_x*0.3, 1)\n",
    "                    ox = int(np.clip(ox,0,imw-w))\n",
    "                    mid_y = (imh-h)/2.\n",
    "                    width_y = imh-h\n",
    "                    oy = np.random.normal(mid_y, width_y*0.3, 1)\n",
    "                    oy = int(np.clip(oy,0,imh-h))\n",
    "                    # insert the crop into src.data[0]\n",
    "                    src.data[0] = image[:,ox:ox+w,oy:oy+h]\n",
    "                else:\n",
    "                    ox = (imw-w)/2.\n",
    "                    oy = (imh-h)/2.\n",
    "                    src.data[0] = image[:,ox:ox+w,oy:oy+h]\n",
    "            else:\n",
    "                ox = 0\n",
    "                oy = 0\n",
    "                src.data[0] = image.copy()\n",
    "\n",
    "            sigma = o['start_sigma'] + ((o['end_sigma'] - o['start_sigma']) * i) / o['iter_n']\n",
    "            step_size = o['start_step_size'] + ((o['end_step_size'] - o['start_step_size']) * i) / o['iter_n']\n",
    "            \n",
    "            make_step(net, end=layer, clip=clip, focus=focus, \n",
    "                      sigma=sigma, step_size=step_size)\n",
    "            \n",
    "            if visualize:\n",
    "                vis = deprocess(net, src.data[0])\n",
    "                if not clip: # adjust image contrast if clipping is disabled\n",
    "                    vis = vis*(255.0/np.percentile(vis, 99.98))\n",
    "                if i % 1 == 0:\n",
    "                    showarray(vis,\"./filename\"+str(i)+\".jpg\")\n",
    "            \n",
    "            if i % 10 == 0:\n",
    "                print 'finished step %d in octave %d' % (i,e)\n",
    "            \n",
    "            # insert modified image back into original image (if necessary)\n",
    "            image[:,ox:ox+w,oy:oy+h] = src.data[0]\n",
    "        \n",
    "        print \"octave %d image:\" % e\n",
    "        showarray(deprocess(net, image),\"./octave_\"+str(e)+\".jpg\")\n",
    "            \n",
    "    # returning the resulting image\n",
    "    return deprocess(net, image)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "starting drawing\n",
      "finished step 0 in octave 0\n",
      "finished step 10 in octave 0\n",
      "finished step 20 in octave 0\n",
      "finished step 30 in octave 0\n",
      "finished step 40 in octave 0\n",
      "finished step 50 in octave 0\n",
      "finished step 60 in octave 0\n",
      "finished step 70 in octave 0\n",
      "finished step 80 in octave 0\n",
      "finished step 90 in octave 0\n",
      "finished step 100 in octave 0\n",
      "finished step 110 in octave 0\n",
      "finished step 120 in octave 0\n",
      "finished step 130 in octave 0\n",
      "finished step 140 in octave 0\n",
      "finished step 150 in octave 0\n",
      "finished step 160 in octave 0\n",
      "finished step 170 in octave 0\n",
      "finished step 180 in octave 0\n",
      "finished step 190 in octave 0\n",
      "octave 0 image:\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADgAOADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3Wiil\n3dsUxiUhpSaaTSJYVDKcCpC1QznKUupNxnBGahkIHJp4b5cVUuj05p21FcbJIo56iq0j5J2g+2an\nVFGNxpPLR0YvIFx92pkuxvDTcqujIuHPzHsKqEFyRGNzDrV9Uw/zkHPQ1XmnitGJgALkcmlClJys\njR1FDXceoeyh3ggu3b0qlcXRO15HBLdqpx31xJG7zja2/Cr6ipwImk8to9wIzn0NVUUaF7q7OWU5\nVHa5TuLsKxDrkDkEdKhGpgnMoZeOMVeksHaMhhiLOeazriIlgigbR2Nc8q1OWrNFThBXvqNSVZwW\nD8n17VYVm8vEuWUdCKoyRrgFkKqOTjvT7e7CzoUYtAeMGtYQjUhzQFOrJq8tUX/sgvYd7ttYfdqS\n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\nTAKKKWgZ/9k=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished step 0 in octave 1\n",
      "finished step 10 in octave 1\n",
      "finished step 20 in octave 1\n",
      "finished step 30 in octave 1\n",
      "finished step 40 in octave 1\n",
      "finished step 50 in octave 1\n",
      "finished step 60 in octave 1\n",
      "finished step 70 in octave 1\n",
      "finished step 80 in octave 1\n",
      "finished step 90 in octave 1\n",
      "octave 1 image:\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADgAOADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3Wmmn\nUZHemMbmkanMg6qc1GxxSJYYqKY4WlMuO3FRzNuQ8VPUlPUYuCM1FK+PvcU8Nhcd6pXR3kgnik1q\nCeoryDNQtkPxzntSrFtXLtj0pMbTncM9qhxutDRSs9TPmDcluucYqtKgEeR1JwK2GghbdvkAY8k+\ntZM8kX2jKHEaUU6MpS12LlU5FdjoLdYI2ZmJk/u5wKrzTBWYZJHsazLrVWurpolBUL0Y9Gqe1iaV\ntkiLk8q6n9K0rr2C1WpzyxEpvVlWe5ZCFRNzMcA5psvnQr/pZ2Z6DPNbcGnKC7FFCryWPrVJrGOS\nOR5z5i54LdSK82eLcnbodceVJOxntbSBTLHIGBxg0kcckc2QxX1XsaesKwOxg+UEcxk0sM/zgTL1\n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\ncKQU4UwAUtFFAH//2Q==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished step 0 in octave 2\n",
      "finished step 10 in octave 2\n",
      "finished step 20 in octave 2\n",
      "finished step 30 in octave 2\n",
      "finished step 40 in octave 2\n",
      "finished step 50 in octave 2\n",
      "finished step 60 in octave 2\n",
      "finished step 70 in octave 2\n",
      "finished step 80 in octave 2\n",
      "finished step 90 in octave 2\n",
      "octave 2 image:\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADrAOsDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3Wkoo\npjEPFJmlbimZpEsQmmMacxqFjUMkY5waa52rzTZG2nd6VA8pcHJoSurlSa2Q2R/Sq7saeV4zUbnn\n3rOTsUnYikB2E5qBYfMfaelWiA8RxjNVJW8oMc4YdBWCfO+VbjT5nYa9tGgYuwXHqagW5RMpEu0f\n3j3qs1xvK3Fw3zdl9KrTXkaDc7D2xXbGgqavN3H7XTljqTPLvJyc+tVZHbHyKc5PXimee04DZKxA\n8gdRWja2ouI0znHXLd/pXJXxChqbU6cZe9IzghyN/frg1KYVRRlSc1Zmt4Io2bynwCQzA8/hWPLK\ndymKY8D7r1hCXtna9jV2irwZakidV3R4yf4aYp3kcbWzjmo7a+DuI2G1wcEVpraKwbGCCM5FdC56\n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\nhTEKKcKQU4UwFApaQU4UwCiiigD/2Q==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished step 0 in octave 3\n",
      "finished step 10 in octave 3\n",
      "finished step 20 in octave 3\n",
      "finished step 30 in octave 3\n",
      "finished step 40 in octave 3\n",
      "octave 3 image:\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/scipy/ndimage/interpolation.py:549: UserWarning: From scipy 0.13.0, the output shape of zoom() is calculated with round() instead of int() - for these inputs the size of the returned array has changed.\n",
      "  \"the returned array has changed.\", UserWarning)\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAD3APcDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3Wkoo\npjEpM0rdKZmkSwJphNKTUbGpZIyQ4GaYDkZokOVxUDylRtXoKlalNpIJXA+tVHc09wX5BqIoaTHF\njCxNVpeZNtWT94cdKglG2Xd+Fc8nZ2K5+g0WwfOSM1BLDDD98gn0ps9w8ZIXqxwM9qoyPsJJdS3c\nmt6WHk/eb0KUvZvV6lt7zI2D5VqhJICxOD+VRNeR9l3EflSJM07fNKqL6D0qqklBWSHFc7sNd2PC\n4H1NCxgp83r1FaENnGckgOeozUdxFFGvIaP3rzp4tN8p0KEFsQeSoHJFV3Rk5Q8elQPcTQuSrl16\n4Iqxa3sU/DfKx9a2jRmlzwYpVGlZ6jR8wBIwa0LR9jAdDTFgDccc0BSjYGeOlbRrcyszlcrOxrLK\n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\nTgKKKYDhThRRQAtLRRTAKKKKAP/Z\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished step 0 in octave 4\n",
      "finished step 10 in octave 4\n",
      "finished step 20 in octave 4\n",
      "octave 4 image:\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEDAQMDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3Wkoo\npjE6UmaU0zNIlimmE0pPFRsalkjWqHIJxUjGq+/y8nuelTu7Fq1rj5Dgc1UkfPSnO5fvVco3c0NW\nFFjWc5qJz8pNSEY96jbmNh3zWE3YvmsVwm8E0pswcHIwaax2xMB1FVZ7p5cohCxjgnPWiFKVR+6P\nX4m7IlYw28nGGYe9QTXW8Esce1VWlCLjaAPVeagN0mf3ahj3LGupwVNajlU52PeQc4yagZnY9Bj6\n1NH5lxy7qB2Aq3HZRhCzLu/2hziuGriuTc3jSitZblBYwyrnjvmpDCoHOKfPHGgO2Uoew9azHvZY\nGO870B645FZU/wB/sy9Yap/IsOrxnKZx6Uinfgng1Lb3EVwMA8npmpxAG+WumMp0naZz1JqWo+0f\n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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "octaves = [\n",
    "    {\n",
    "        'layer':'inception_4c/output',\n",
    "        'iter_n':200,\n",
    "        'start_sigma':2.5,\n",
    "        'end_sigma':1.1,\n",
    "        'start_step_size':12.,\n",
    "        'end_step_size':10.,\n",
    "    },\n",
    "    {\n",
    "        'layer':'inception_4c/output',\n",
    "        'iter_n':100,\n",
    "        'start_sigma':1.1,\n",
    "        'end_sigma':0.78*1.1,\n",
    "        'start_step_size':10.,\n",
    "        'end_step_size':8.\n",
    "    },\n",
    "    {\n",
    "        'layer':'inception_4c/output',\n",
    "        'scale':1.05,\n",
    "        'iter_n':100,\n",
    "        'start_sigma':0.78*1.1,\n",
    "        'end_sigma':0.78,\n",
    "        'start_step_size':8.,\n",
    "        'end_step_size':6.\n",
    "    },\n",
    "    {\n",
    "        'layer':'inception_4c/output',\n",
    "        'scale':1.05,\n",
    "        'iter_n':50,\n",
    "        'start_sigma':0.78*1.1,\n",
    "        'end_sigma':0.40,\n",
    "        'start_step_size':6.,\n",
    "        'end_step_size':1.5\n",
    "    },\n",
    "    {\n",
    "        'layer':'inception_4c/output',\n",
    "        'scale':1.05,\n",
    "        'iter_n':25,\n",
    "        'start_sigma':0.4,\n",
    "        'end_sigma':0.3,\n",
    "        'start_step_size':1.5,\n",
    "        'end_step_size':0.5\n",
    "    }\n",
    "]\n",
    "\n",
    "# get original input size of network\n",
    "original_w = net.blobs['data'].width\n",
    "original_h = net.blobs['data'].height\n",
    "# the background color of the initial image\n",
    "background_color = np.float32([250.0, 250.0, 250.0])\n",
    "# generate initial random image\n",
    "gen_image = np.random.normal(background_color, 8, (original_w, original_h, 3))\n",
    "\n",
    "# which filter in layer to visualize (conv5 has 512 filters)\n",
    "imagenet_class = 411\n",
    "\n",
    "# generate class visualization via octavewise gradient ascent\n",
    "gen_image = deepdraw(net, gen_image, octaves, focus=imagenet_class, \n",
    "                 random_crop=True, visualize=False)\n",
    "\n",
    "# save image\n",
    "#img_fn = '_'.join([model_name, \"deepdraw\", str(imagenet_class)+'.png'])\n",
    "#PIL.Image.fromarray(np.uint8(gen_image)).save('./' + img_fn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
